﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;

namespace SegIdenPC.Formularios
{
    public partial class frmMantComponenteProducto : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantComponenteProducto));

        private const string TITULO = "Componente Productos";

        public ListaComponente listaComponente { get; set; }

        public Boolean Componentes = false;

        public Boolean UnionProducto = false;
      
        #endregion

        #region --- Constructor ---
        public frmMantComponenteProducto()
        {
            InitializeComponent();
        }

        #endregion

        #region --- Eventos Formulario ---

        private void frmMantComponenteProducto_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void btnAsociarProducto_Click(object sender, EventArgs e)
        {
            asociarProducto();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            quitarComponente();
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            agregarComponente();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            grabar();
        }

        #endregion

        #region --- Metodos Propios ---

        private void cargarFormulario()
        {
            if (this.listaComponente.lista.Count > 0)
            {

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoComponentes.AutoGenerateColumns = false;

                // Se establece fuente de datos
                this.dgvListadoComponentes.DataSource = this.listaComponente.lista == null ?
                                                        new ListPersonalizada<Componente>() :
                                                        this.listaComponente.lista;

                formatearGrilla();
            }
        }

        private void formatearGrilla()
        {
            ListPersonalizada<Componente> listaComponente = null;
            listaComponente = (ListPersonalizada<Componente>)this.dgvListadoComponentes.DataSource;

            if (listaComponente != null)
            {
                for (int i = 0; i < listaComponente.Count; i++)
                {
                    var componente = listaComponente[i];
                    if (componente.producto != null)    this.dgvListadoComponentes.Rows[i].Cells[2].Value = componente.producto.descripcion;
                }
            }
        }

        private void asociarProducto()
        {
            
            try
            {
                // Obteniendo lista de componentes
                ListPersonalizada<Componente> listaComponente = (ListPersonalizada<Componente>)this.dgvListadoComponentes.DataSource;

                if (listaComponente != null && listaComponente.Count > 0)
                {
                    // Obteniedo componente seleccionado
                    Componente componente = listaComponente[this.dgvListadoComponentes.CurrentRow.Index];

                    //Se selecciona el componente y se llama la ventana para colocar el producto
                    using (frmBuscarProducto frmBuscarProducto = new frmBuscarProducto())
                    {

                        if (frmBuscarProducto.ShowDialog() == DialogResult.Cancel) { return; }

                        componente.producto = frmBuscarProducto.productoActual;

                    }

                    // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                    this.dgvListadoComponentes.AutoGenerateColumns = false;

                    // Actualizando fuente de datos de la grilla
                    this.dgvListadoComponentes.DataSource = null;
                    this.dgvListadoComponentes.DataSource = listaComponente;

                    formatearGrilla();
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        
        }

        private void agregarComponente()
        {
            Componente componenteSeleccionado = null;
            try
            {
                using (frmMantComponente frmMantComponente = new frmMantComponente())
                {
                    // Validar si se cancelo operacion
                    if (frmMantComponente.ShowDialog() == DialogResult.Cancel) { return; }
                    // Obtener componente seleccionado
                    componenteSeleccionado = frmMantComponente.componenteActual;
                }

                if (validarComponenteRepetido(componenteSeleccionado.codigo))
                {
                    Libreria.CampoNecesario(this.dgvListadoComponentes, "Este componente ya se encuentra asociado al producto", TITULO);
                    return;
                }

                // Obteniendo lista de componentes
                ListPersonalizada<Componente> listaComponente = (ListPersonalizada<Componente>)this.dgvListadoComponentes.DataSource;
                if (listaComponente == null) { listaComponente = new ListPersonalizada<Componente>(); }

                // Agregando contacto
                listaComponente.Add(componenteSeleccionado);

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoComponentes.AutoGenerateColumns = false;

                // Actualizando fuente de datos de la grilla
                this.dgvListadoComponentes.DataSource = null;
                this.dgvListadoComponentes.DataSource = listaComponente;

                formatearGrilla();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void quitarComponente()
        {
            try
            {
                // Obteniendo lista de componentes
                ListPersonalizada<Componente> listaComponente = (ListPersonalizada<Componente>)this.dgvListadoComponentes.DataSource;

                if (listaComponente != null && listaComponente.Count > 0)
                {
                    // Obteniedo componente seleccionado
                    Componente componente = listaComponente[this.dgvListadoComponentes.CurrentRow.Index];

                    // Eliminando contacto
                    listaComponente.Remove(componente);

                    // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                    this.dgvListadoComponentes.AutoGenerateColumns = false;

                    // Actualizando fuente de datos de la grilla
                    this.dgvListadoComponentes.DataSource = null;
                    this.dgvListadoComponentes.DataSource = listaComponente;

                    formatearGrilla();
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private bool validarComponenteRepetido(string codigoComponente)
        {
            bool resultato = false;

            // Obteniendo lista de componentes
            ListPersonalizada<Componente> listaComponentes = (ListPersonalizada<Componente>)this.dgvListadoComponentes.DataSource;

            if (listaComponentes != null)
            {
                foreach (Componente componente in listaComponentes)
                {
                    if (componente.codigo.Equals(codigoComponente))
                    {
                        resultato = true;
                        break;
                    }
                }
            }

            return resultato;
        }

        private void salir()
        {
            this.DialogResult = DialogResult.Cancel;
        }

        private void grabar()
        {
            ListPersonalizada<Componente> listaComponente = (ListPersonalizada<Componente>)this.dgvListadoComponentes.DataSource;

            ListaComponente listaComponenteTemp = new ListaComponente();
            foreach (Componente componente in listaComponente)
            {
                listaComponenteTemp.add(componente);
            }

            this.listaComponente = listaComponenteTemp;

            if (this.listaComponente.lista.Count > 0) this.Componentes = true;
            foreach (Componente componente in this.listaComponente.lista)
            {
                if (componente.producto != null)
                {
                    this.UnionProducto = true;
                }
            }
            this.DialogResult = DialogResult.OK;
        }
        #endregion
    }
}
